"""
游戏板类模块，定义了游戏板的状态和行为。
"""
from typing import List, Tuple, Optional
import random

from tetris.constants import BOARD_WIDTH, BOARD_HEIGHT, COLORS
from tetris.tetromino import Tetromino


class Board:
    """游戏板类，表示一个玩家的游戏区域"""
    
    def __init__(self) -> None:
        """初始化游戏板"""
        # 创建一个空的游戏板网格
        # 注意: 这里很可能存在一个错误导致初始化了带方块的游戏板
        self.grid = [[None for _ in range(BOARD_WIDTH)] for _ in range(BOARD_HEIGHT)]
        
        # 添加调试验证
        filled_cells = sum(1 for row in self.grid for cell in row if cell is not None)
        if filled_cells > 0:
            print(f"警告: Board.__init__() 创建了非空游戏板! 有 {filled_cells} 个填充格子")
        
        # 游戏状态
        self.score = 0
        self.level = 1
        self.lines_cleared = 0
        
    def is_valid_position(self, tetromino: Tetromino) -> bool:
        """
        检查方块是否在有效位置
        
        Args:
            tetromino: 要检查的方块
            
        Returns:
            如果位置有效返回True，否则返回False
        """
        for x, y in tetromino.get_coords():
            # 检查左右边界
            if x < 0 or x >= BOARD_WIDTH:
                return False
            
            # 检查底部边界
            if y >= BOARD_HEIGHT:
                return False
            
            # 检查是否与已有方块重叠（只检查在游戏板内的部分）
            if y >= 0 and self.grid[y][x] is not None:
                return False
                
        return True
    
    def add_tetromino(self, tetromino: Tetromino) -> None:
        """
        将方块添加到游戏板上
        
        Args:
            tetromino: 要添加的方块
        """
        for x, y in tetromino.get_coords():
            if 0 <= y < BOARD_HEIGHT and 0 <= x < BOARD_WIDTH:
                self.grid[y][x] = tetromino.color
    
    def clear_lines(self) -> int:
        """
        清除所有已填满的行并返回清除的行数
        
        Returns:
            清除的行数
        """
        lines_cleared = 0
        y = BOARD_HEIGHT - 1
        
        while y >= 0:
            # 检查当前行是否已填满
            if all(cell is not None for cell in self.grid[y]):
                lines_cleared += 1
                
                # 将上面的所有行下移
                for y2 in range(y, 0, -1):
                    self.grid[y2] = self.grid[y2 - 1].copy()
                
                # 创建新的空行
                self.grid[0] = [None for _ in range(BOARD_WIDTH)]
            else:
                y -= 1
        
        # 更新分数和级别
        if lines_cleared > 0:
            # 分数计算：清除的行数平方乘以100
            self.score += lines_cleared * lines_cleared * 100
            self.lines_cleared += lines_cleared
            self.level = (self.lines_cleared // 10) + 1
            
        return lines_cleared
    
    def is_game_over(self) -> bool:
        """
        检查游戏是否结束(最上面几行有方块)
        
        Returns:
            如果游戏结束返回True，否则返回False
        """
        # 检查第三行，给更多空间并避免初始方块导致即时游戏结束
        return any(cell is not None for cell in self.grid[2]) 